package com.example.mydemo.config;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

/**
 * 类描述 -> JWT工具类
 *
 * @Author: ywz
 * @Date: 2024/09/18
 */
public class JWTUtils {

    /**
     * 生成token使用的预定义密钥
     */
    private static final String SING = "ywz";


    /**
     * 根据输入的键值对Map生成JWT令牌
     * 该方法主要用于创建一个带有过期时间及指定算法签名的JWT令牌
     *
     * @param map 包含令牌payload数据的键值对Map，其中键为claim名称，值为claim值
     * @return 返回生成的JWT令牌字符串
     */
    public static String getToken(Map<String, String> map) {
        // 获取当前时间并创建日历实例
        Calendar instance = Calendar.getInstance();
        // 设置令牌默认7天后过期
        instance.add(Calendar.DATE, 7);
        // 创建JWT构建器
        JWTCreator.Builder builder = JWT.create();
        // 设置payload中的claim，使用传入的Map进行遍历设置
        map.forEach(builder::withClaim);

        // 生成带有过期时间的令牌，并使用HMAC256算法进行签名
        // 这里使用了HMAC256算法对令牌进行签名，确保其安全性和完整性
        return builder.withExpiresAt(instance.getTime())
                .sign(Algorithm.HMAC256(SING));
    }


    /**
     * 方法描述 -> 获取token信息方法
     *
     * @param token JWT令牌字符串
     * @Author: ywz
     * @Date: 2024/09/18
     */
    public static DecodedJWT getTokenInfo(String token) {
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }

}
